#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:taotieren

"""
    rpi.gpio 需要 root 权限，板上运行需要使用
    sudo python pos_step.py
    读取调谐电位器的阻值
        光敏电阻，2 个 1KΩ 电阻，330nF 电容
        Pin_18 -- 1K ---- RP_1Pin
        Pin_23 -- 1K ---- RP_2Pin
                       |
                       |
                      330nF
                       |
                       |
         GND -----------

         简化之后

        Pin_18 -- 0Ω ---- RP_1Pin
                       -- RP_2Pin
                       |
                       |
                      330nF
                       |
                       |
         GND -----------

在使用一个引脚的情况下，通过光敏电阻给电容放电之后，charge_time 函数通过光敏电阻为电容充电仅需要 1ms，
它将该引脚设置为输入，并且测试其电压是否达到阈值 HIGH，然后重复测试直到电压达到 HIGH 为止，
光敏电阻
光线越亮 --> 电阻越小
光线越暗 --> 电阻越大
阻值会在 1KΩ（强光）~ 100KΩ（完全黑暗）之间变动
还可以使用 ADC 和光敏电阻来测量光的强度
"""

""" 非树莓派环境下可以用 rpi.gpio_def 代替 rpi.gpio 来进行程序调试和验证 """
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
pin = 18


def discharge():
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, False)
    time.sleep(0.1)


# 返回电容器变为高电平所需的时间
# 这是 1.65v 或更高
def charge_time():
    t1 = time.time()
    GPIO.setup(pin, GPIO.IN)
    while not GPIO.input(pin):
        # 充电 1ms
        GPIO.setup(pin, GPIO.OUT)
        GPIO.output(pin, True)
        time.sleep(0.001)
        # 设置为输入以再次测试
        GPIO.setup(pin, GPIO.IN)
        time.sleep(0.001)
        t2 = time.time()
        return (t2 - t1) * 1000000


# 取模拟读数作为充电C的时间
def analog_read():
    discharge()
    return charge_time()


while True:
    print(analog_read())
    time.sleep(0.5)
